package test;

import java.util.concurrent.*;

public class MyThreadPool {

    // 固定数量的线程 fixed
    public static ExecutorService executorService
            = Executors.newScheduledThreadPool(3);

    //newFixedThreadPool 固定线程数的线程池 线程不会被回收 （核心线程数为3）（n,n）
    //newCacheThreadPool 缓存线程池 线程会被回收 （核心线程数为0，最大线程数为MAX）（0，max）
    //newSingleThreadExecutor 单线程线程池 单线程从队列中获取任务顺序执行 （1，1）
    //newScheduledThreadPool 定时任务线程池 核心线程数自定义，最大线程数MAX


    /**
     * 7大参数
     * coreThread： 核心线程数，不会被回收的最小线程数
     * maximumPoolSize： 线程池允许的最大线程数，如果请求任务并发超过coreThread数，最大也不会过这个值
     * 等待时间： 当超过coreThread数的部分线程超时了，则释放
     * 时间尺度： 等待时间的尺度
     * 阻塞队列： 超过核心线程数的任务进入线程池后，会进入阻塞队列等待，线程一点空闲，就从队列中拿去一个进行消费
     * 线程工厂： 线程的创建方式
     * 拒绝策略： 当coreThread满，阻塞队列满 最大线程满，执行拒绝策略
     *                          1.AbortPolicy： 新任务进来直接丢弃（抛异常）
     *                          2.CallerRunsPolicy： 不使用线程池，直接创建，保证任务不丢失 但会有数据处理积压的情况
     *                          3.DiscardOldestPolicy： 丢弃最老的任务，去使用新的任务
     *                          4.DiscardPolicy： 丢弃新的任务 不抛异常
     */
    public static ThreadPoolExecutor executor = new ThreadPoolExecutor(
            4,//核心线程数
            10,//最大线程数
            30L,//等待时间
            TimeUnit.SECONDS, //时间尺度
            new LinkedBlockingQueue<>(5000), //阻塞队列
            Executors.defaultThreadFactory() ,//默认就行线程工厂 -- 如何创建线程
            new ThreadPoolExecutor.AbortPolicy()//拒绝策略
    );
}
